home *** CD-ROM | disk | FTP | other *** search
/ Aminet 38 / Aminet 38 (2000)(Schatztruhe)[!][Aug 2000].iso / Aminet / misc / math / libalgo.lha / algomath / src / init.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-30  |  1.3 KB  |  92 lines

  1.  
  2. #include "defs.h"
  3.  
  4. int *_am_primearray_init = NULL;
  5. int *_am_pp_init = NULL;
  6. int _am_asciiconv[]={1000000000,
  7.                     100000000,
  8.                     10000000,
  9.                     1000000,
  10.                     100000,
  11.                     10000,
  12.                     1000,
  13.                     100,
  14.                     10,
  15.                     1};
  16.  
  17.  
  18. int am_init()
  19. {
  20.     int a;
  21.     if((_am_primearray_init = _getPrimes(46338)) == 0)
  22.         return 0;
  23.     if((_am_pp_init=(int*)malloc(4792*sizeof(int)))==NULL)
  24.         return 0;
  25.     for(a=0;a<4792;a++){
  26.         _am_pp_init[a]=_am_primearray_init[a]*_am_primearray_init[a];
  27.     }
  28.     return 1;
  29. }
  30.  
  31. int* _getPrimes(int limit)
  32. {
  33.     int i;
  34.     int j;
  35.     int n;
  36.     int* p = 0;
  37.  
  38.     if(limit < 10)
  39.     {
  40.         if((p = (int*)malloc(5 * sizeof(int))) == 0)
  41.             return 0;
  42.         p[0] = 2;
  43.         p[1] = 3;
  44.         p[2] = 5;
  45.         p[3] = 7;
  46.         p[4] = 0;
  47.         if(limit < 7)
  48.             p[3] = 0;
  49.         if(limit < 5)
  50.             p[2] = 0;
  51.         if(limit < 3)
  52.             p[1] = 0;
  53.         if(limit < 2)
  54.             p[1] = 0;
  55.         return p;
  56.     }
  57.  
  58.     if((p = (int*)calloc(limit,sizeof(int))) == 0)
  59.         return 0;
  60.     p[0] = 2;
  61.     p[1] = 3;
  62.     p[2] = 5;
  63.     p[3] = 0;
  64.     n = 3;
  65.  
  66.     for(i = 9; i < limit; i+= 6)
  67.         p[i] = 1;
  68.     for(i = 25; i < limit; i += 30)
  69.         p[i] = 1;
  70.     for(i = 35; i < limit; i += 30)
  71.         p[i] = 1;
  72.  
  73.     i = 7;
  74.     while(i * i < limit)
  75.     {
  76.         p[n++] = i;
  77.         for(j = i * i; j < limit; j += 2 * i)
  78.             p[j] = 1;
  79.         while(p[i += 2] != 0);
  80.     }
  81.  
  82.     while(i < limit)
  83.     {
  84.         p[n++] = i;
  85.         while((i += 2) < limit && p[i] != 0);
  86.     }
  87.  
  88.     p[n] = 0;
  89.     p = (int*)realloc(p,(n + 1) * sizeof(int));
  90.  
  91.     return p;
  92. }